package com.skyline.feed.dao;

import java.util.List;

import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.skyline.feed.type.FeedType;

/**
 * 订阅Feed的Dao
 * 
 * @author Jairus Chan
 * @version 0.1
 */
public interface SubscribedFeedDao {

	/**
	 * 插入Feed（不建议使用） <br>
	 * 推荐使用public void insertFeed(DBCursor cursor)
	 * 
	 * @param resourceId
	 *            资源的ID
	 * @param title
	 *            资源title
	 * @param content
	 *            内容
	 * @param providerId
	 *            提供者Id，在PersonalFeed中，就是feed所有者的Id
	 * @param providerNickname
	 *            提供者的昵称
	 * @param providerPortrait
	 *            提供者的头像
	 * @param ownerId
	 *            feed所有者的Id
	 * @param type
	 *            feed的类型
	 * @param level
	 *            等级
	 */
	public void insertFeed(Long resourceId, String title, String content, Long providerId, String providerNickname,
			String providerPortrait, Long ownerId, FeedType type, Integer level);

	/**
	 * 批量插入Feed<br>
	 * 与insertFeeds(List<DBObject> feeds,Long ownerId)相比，这种方式更加节省内存，但速度更慢一些。
	 * 
	 * @param cursor
	 *            插入对象组的游标
	 * @param ownerId
	 *            Feed所有者的Id(当将Feed订阅过来时，需要将ownerId置为自己)
	 */
	public void insertFeeds(DBCursor cursor, Long ownerId);

	/**
	 * 批量插入Feed<br>
	 * 与insertFeeds(DBCursor cursor, Long ownerId)相比，这种方式更加快，但内存消耗很大。
	 * 
	 * @param feeds
	 *            feed列表
	 * @param ownerId
	 *            Feed所有者的Id(当将Feed订阅过来时，需要将ownerId置为自己)
	 */
	public void insertFeeds(List<DBObject> feeds, Long ownerId);

	/**
	 * 插入Feed <br>
	 * 建议将修改ownerId在service层处理掉
	 * 
	 * @param obj
	 *            插入的对象
	 */
	public void insertFeed(DBObject obj);

	/**
	 * 查询Feed<br>
	 * 此功能主要用于个人的首页，输出用户所关注的好友与地点的信息。
	 * 
	 * @param ownerId
	 *            Feed所有者
	 * @param current
	 *            当前记录
	 * @param level
	 *            等级
	 * @return
	 */
	public List<DBObject> queryFeeds(Long ownerId, Integer current, Integer level);

	/**
	 * 查询某一用户在某一等级下最新的一条记录
	 * 
	 * @param ownerId
	 *            所有者的Id
	 * @param level
	 *            等级
	 * @return
	 */
	public DBObject queryNewestFeed(Long ownerId, Integer level);

	/**
	 * 查询某一个用户在某一个段内的记录
	 * 
	 * @param ownerId
	 *            用户的Id
	 * @param start
	 *            开始的记录
	 * @param end
	 *            结束的记录
	 * @param level
	 *            等级
	 * @return
	 */
	public List<DBObject> queryFeeds(Long ownerId, Integer start, Integer end, Integer level);

}
